/**
 * Copyright (c) 2008, EffCode, www.effcode.com
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list 
 * of conditions and the following disclaimer. 
 * Redistributions in binary form must reproduce the above copyright notice, this list 
 * of conditions and the following disclaimer in the documentation and/or other materials
 * provided with the distribution. 
 * Neither the name of the EffCode nor the names of its contributors may be used 
 * to endorse or promote products derived from this software without specific prior written 
 * permission. 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package org.effdom.impl;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

import org.effdom.Document;
import org.effdom.Element;

/**
 * @author <a href="mailto:mattias@effcode.com">Mattias Jonsson</a>
 */
public class AttrString extends AttrBase {

    protected byte[] strArray;
    
    public AttrString(Document document, Element parent, short id, String value) {
        super(document, parent, id);
        setValue(value);
    }

    public String value() throws IllegalStateException {
        ByteArrayInputStream in = new ByteArrayInputStream(strArray);
        DataInputStream in2 = new DataInputStream(in);
        try {
            return in2.readUTF();
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
//        if (strArray != null) {
//            try {
//                return new String(strArray, "utf8");
//            } catch (UnsupportedEncodingException e) {
//                throw new IllegalStateException(e.getMessage(), e);
//            }
//        } else {
//            throw new IllegalStateException("No value is set");
//        }
    }

    public byte[] valueAsByteArray() throws IllegalStateException {
        if (strArray != null) {
            return strArray;
        } else {
            throw new IllegalStateException("No value is set");
        }
    }

    private void setValue(String value) throws IllegalStateException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        DataOutputStream out2 = new DataOutputStream(out);
        try {
            out2.writeUTF(value);
        } catch (IOException e) {
            throw new IllegalStateException(e.getMessage());
        }
        strArray = out.toByteArray();
        length = strArray.length;
        setLengthSize(length);
    }
}
